package com.leo.tool.jdk.jdk8;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法，但是可以有多个非抽象方法的接口。(更好地支持lambda)
 * 新增的函数式接口定义在java.util.function包中，如Consumer，Supplier，Predicate等
 */
public class FunctionalTest {
	
	 public static void main(String args[]){
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
		
		// Predicate<Integer> predicate = n -> true
		// n 是一个参数传递到 Predicate 接口的 test 方法
		// n 如果存在则 test 方法返回 true
		
		System.out.println("输出所有数据:");
		
		// 传递参数 n
		eval(list, n->true);
		
		// Predicate<Integer> predicate1 = n -> n%2 == 0
		// n 是一个参数传递到 Predicate 接口的 test 方法
		// 如果 n%2 为 0 test 方法返回 true
		
		System.out.println("输出所有偶数:");
		eval(list, n-> n%2 == 0 );
		
		// Predicate<Integer> predicate2 = n -> n > 3
		// n 是一个参数传递到 Predicate 接口的 test 方法
		// 如果 n 大于 3 test 方法返回 true
		
		System.out.println("输出大于 3 的所有数字:");
		eval(list, n-> n > 3 );
	}
		
	public static void eval(List<Integer> list, Predicate<Integer> predicate) {
		for(Integer n: list) {
			if(predicate.test(n)) {
				System.out.println(n + " ");
			}
		}
	}
}
